package archivos;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import utils.OS;

/**
 * @file Txt.java
 * @author Juan Humanes Ferrer
 * @date 04-Marzo-2014
 * @description Clase para tratar con ficheros .txt
 */
public class Txt {

    /**
     * Método que retorna la lista de Pathways con enlaces a partir de un
     * fichero y sabiendo la ruta del organismo
     *
     * @param archivo
     * @param rutaOrg
     * @return
     */
    public static List<String> leeFicheroPathway(File archivo, String rutaOrg) {
        List<String> lista1 = new ArrayList();

        FileReader fr = null;
        BufferedReader br = null;

        try {

            String separator = OS.getDirectorySeparator();

            fr = new FileReader(archivo);
            br = new BufferedReader(fr);
            // Lectura del fichero
            String linea;
            while ((linea = br.readLine()) != null) {
                String[] orgEspacio = linea.split("\t");

                String nombre = orgEspacio[1];

                int posRaya = nombre.lastIndexOf("-");

                String org = nombre.substring(0, posRaya - 1);
                if (org.contains("/")) {
                    String[] a = org.split(" ");
                    org = a[0];
                }

                File fileOrg = new File(rutaOrg + separator + "kegg" + separator + "sif" + separator + org + ".sif");

                if (fileOrg.length() > 0.0) {
                    lista1.add(org);
                }

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return lista1;
    }

    /**
     * Método que retorna la lista de todos los pathways a partir de un fichero
     *
     * @param archivo
     * @return
     */
    public static List<String> listaPathways(File archivo) {
        List<String> lista1 = new ArrayList();
        FileReader fr = null;
        BufferedReader br = null;

        try {

            // Apertura del fichero y creacion de BufferedReader para poder
            // hacer una lectura comoda (disponer del metodo readLine()).
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {
                String[] orgEspacio = linea.split("\t");

                String nombre = orgEspacio[1];

                int posRaya = nombre.lastIndexOf("-");

                String org = nombre.substring(0, posRaya - 1);
                if (org.contains("/")) {
                    String[] a = org.split(" ");
                    org = a[0];
                }

                lista1.add(org);

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return lista1;
    }

    /**
     * Método que retorna la lista de todos los organismos a partir de un
     * fichero
     *
     * @param archivo
     * @return
     */
    public static List<String> listaOrg(File archivo) {
        List<String> lista1 = new ArrayList();
        //File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {
                String[] org = linea.split("\t");
                lista1.add(org[0]);
                lista1.add(org[1]);

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return lista1;

    }

    /**
     * Método que retorna la lista de todos los codigos de organismos a partir
     * de un fichero
     *
     * @param archivo
     * @return
     */
    public static List<String> listaOrgCFA(File archivo) {
        List<String> lista1 = new ArrayList();
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {
                String[] org = linea.split("\t");
                lista1.add(org[0]);

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return lista1;

    }

    /**
     * Método que retorna la nomenclatura de un organismo
     *
     * @param archivo Fichero de organismos de FA
     * @param organismo
     * @return
     */
    public static String nomenclaturaFA(File archivo, String organismo) {
        String nomenclatura = "";
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {
                String[] org = linea.split("\t");
                if (org[0].equals(organismo)) {
                    nomenclatura = org[2];
                }

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return nomenclatura;

    }

    /**
     * Método que retorna la lista de todos los organismos de FA
     *
     * @param archivo
     * @return
     */
    public static List<String> listaOrgFA(File archivo) {
        List<String> lista1 = new ArrayList();
        //File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {
                String[] org = linea.split("\t");
                lista1.add(org[1]);

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return lista1;

    }

    /**
     * Método que devuelve el nombre de un organismo de FA
     *
     * @param archivo
     * @param carpeta
     * @return
     */
    public static String orgFA(File archivo, String carpeta) {
        String organismo = "";
        boolean enc = false;
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {
                String[] org = linea.split("\t");
                if (org[0].equals(carpeta)) {
                    organismo = org[1];
                    enc = true;
                }

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return organismo;

    }

    /**
     * Método que retorna la nomenclatura de un organismo
     *
     * @param archivo
     * @param carpeta
     * @return
     */
    public static String nameSpaceFA(File archivo, String carpeta) {
        String nameSpace = "";
        boolean enc = false;
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {
                String[] org = linea.split("\t");
                if (org[0].equals(carpeta)) {
                    nameSpace = org[2];
                    enc = true;
                }

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return nameSpace;

    }

    /**
     * Método que retorna la lista de todos los organismos de FA
     *
     * @param archivo
     * @return
     */
    public static List<String> listaOrgGO(File archivo) {
        List<String> lista1 = new ArrayList();
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {
                String[] org = linea.split("\t");
                lista1.add(org[0]);
                lista1.add(org[3]);

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return lista1;

    }

    /**
     * Método que retorna la base de datos en R de un organismo
     *
     * @param archivo
     * @param organismo
     * @return
     */
    public static String bdGO(File archivo, String organismo) {
        String bd = null;
        boolean enc = false;
        //File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null && enc == false) {
                String[] org = linea.split("\t");
                if (org[0].equals(organismo)) {
                    bd = org[2];
                    enc = true;
                }

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return bd;

    }

    /**
     * Método elimina genes duplicados de un fichero con una lista de genes
     *
     * @param archivo
     */
    public static void cleanGenes(File archivo) {

        List<String> lista1 = new ArrayList();
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {
                if (!lista1.contains(linea)) {
                    lista1.add(linea);
                }

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        try {
            FileWriter fichero = null;
            PrintWriter pw = null;
            archivo.delete();
            archivo.createNewFile();
            fichero = new FileWriter(archivo);
            pw = new PrintWriter(fichero);

            for (String lista11 : lista1) {
                pw.flush();
                pw.println(lista11);
                pw.flush();
            }

        } catch (IOException e) {
        }

    }

    /**
     * Método que retorna la lista de genes de una termino de GO
     *
     * @param name nombre del termino
     * @param ontologia de Go a la que pertenece el GO
     * @param ruta de la carpeta temporal de usuario
     * @return lista1 lista de genes
     * @throws java.lang.InterruptedException
     */
    public static List<String> genesTermino(String name, String ontologia, String ruta) throws InterruptedException {
        String separator = OS.getDirectorySeparator();
        List<String> lista1 = new ArrayList();

        //File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;

        File archivo = new File(ruta + separator + "genes" + ontologia + ".txt");
        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {
                String[] org = linea.split(" ");
                if (org[0].equals(name)) {
                    lista1.add(org[2]);
                }

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return lista1;

    }

    /**
     * Método que retorna la lista de todos los organismos de Goganpa
     *
     * @param organismo
     * @param archivo
     * @return
     */
    public static String orgGoganpa(String organismo, File archivo) {
        String bd = null;
        boolean enc = false;
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null && enc == false) {
                String[] org = linea.split("\t");
                if (org[0].equals(organismo)) {
                    bd = org[1];
                    enc = true;
                }

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return bd;
    }

    /**
     * Método que retorna una lista con los genes de un archivo
     *
     * @param archivo
     * @return
     */
    public static List<String> listaGenes(File archivo) {
        List<String> lista1 = new ArrayList();
        //File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;

        try {

            // Apertura del fichero y creacion de BufferedReader para poder
            // hacer una lectura comoda (disponer del metodo readLine()).
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {

                lista1.add(linea);

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return lista1;
    }

    /**
     * Método que devuelve un String con lista de genes del fichero de entrada.
     * Se pasa por parametro la ruta del fichero.
     *
     * @param archivo
     * @return listaGenes
     */
    public static String genes(String archivo) {
        String listaGenes = "";

        FileReader fr = null;
        BufferedReader br = null;

        try {
            // Apertura del fichero y creacion de BufferedReader para poder
            // hacer una lectura comoda (disponer del metodo readLine()).

            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            int cont = 0;
            String linea;
            //Se le da el formato necesario para el script R
            while ((linea = br.readLine()) != null) {
                String[] l = linea.split(" ");
                if(!l[0].equals("")){
                if (cont != 0) {
                    listaGenes += ",";
                }
                listaGenes += "\"" + l[0] + "\"";

                cont++;
                }
            }
            listaGenes = listaGenes.substring(0, listaGenes.length());

        } catch (IOException e) {

        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {

            }
        }
        return listaGenes;

    }

    /**
     * Método que retorna la lista de genes de una ontologia de GO
     *
     * @param archivo
     * @return
     */
    public static List<String> goGenes(File archivo) {
        List<String> genes = new ArrayList();
        FileReader fr = null;
        BufferedReader br = null;

        try {
            fr = new FileReader(archivo);
            br = new BufferedReader(fr);

            // Lectura del fichero
            String linea;

            while ((linea = br.readLine()) != null) {
                String[] org = linea.split(" ");
                for (int i = 2; i < org.length; i++) {
                    if (!org[i].equals("NA")) {
                        if (!genes.contains(org[i])) {
                            genes.add(org[i]);
                        }
                    }
                }

            }
        } catch (IOException e) {
        } finally {
            // En el finally cerramos el fichero, para asegurarnos
            // que se cierra tanto si todo va bien como si salta 
            // una excepcion.
            try {
                if (null != fr) {
                    fr.close();
                }
            } catch (IOException e2) {
            }
        }
        return genes;
    }
}
